package br.uesc.newigrafu.swing.visao;

import br.uesc.newigrafu.dominio.NewIGrafu;
import br.uesc.newigrafu.swing.controle.ControlePainelReconstrucao;
import br.uesc.newigrafu.swing.visao.util.PainelRotulado;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

public class PainelReconstrucao extends JPanel {

    static int seq_id = 1;
    int id = seq_id++;

    NewIGrafu newIGrafu = null;
    ControlePainelReconstrucao controlePainelReconstrucao = null;
    JList listaMetodos = null;
    JList listaProgramas = null;
    // Modo de reconstrução
    JPanel painelModoReconstrucao = null;
    ButtonGroup grupoBotoesModoReconstrucao = null;
    JRadioButton radioBotaoModoReconstrucaoManual = null;
    JRadioButton radioBotaoModoReconstrucaoAutomatico = null;
    // Arquivo de entrada
    PainelRotulado painelArquivoEntrada = null;
    JTextField campoTextoArquivoEntrada = null;
    JButton botaoEditar = null;
    JButton botaoCarregarArquivoEntrada = null;
    // Métodos
    PainelRotulado painelMetodo = null;
    JComboBox comboMetodo = null;
    // Programas
    PainelRotulado painelPrograma = null;
    JComboBox comboPrograma = null;
    // Parâmetros do Programa
    PainelRotulado painelParametros = null;
    // Opções de Execução
    JPanel painelOpcoesExecucao = null;
    // Botões
    JButton botaoAlterar = null;
    JButton botaoVerArvore = null;
    JButton botaoExecutar = null;

    PainelDigrafu painelDigrafu = null;
    
    public PainelReconstrucao(NewIGrafu _newIGrafu) {
        super();

        newIGrafu = _newIGrafu;
        setName("PainelReconstrucao");
        TitledBorder borda = BorderFactory.createTitledBorder(
                "Reconstrução " + id);
        // setBorder(borda);
        adicionaComponentes();
        controlePainelReconstrucao = new ControlePainelReconstrucao(newIGrafu,
            this);
        adicionaListeners();
        //setBackground(new Color(255, 0, 0));
        System.out.println("PainelReconstrucao criado!");
        //JanelaDigrafu jDigrafu = new JanelaDigrafu(getPainelDigrafu());
    }

    private void adicionaComponentes() {
        GridBagConstraints c = new GridBagConstraints();
        setLayout(new GridBagLayout());

        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 5;
        c.gridheight = 1;
        c.anchor = GridBagConstraints.PAGE_START;
        c.weightx = 0.5;
        c.weighty = 0.0;
        c.fill = GridBagConstraints.HORIZONTAL;
        c.insets = new Insets(10, 10, 10, 10);
        c.ipadx = 10;
        c.ipady = 10;
        add(getPainelArquivoEntrada(), c);

        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 4;
        c.gridheight = 4;
        c.weightx = 0.9;
        c.weighty = 0.9;
        c.anchor = GridBagConstraints.CENTER;
        c.fill = GridBagConstraints.BOTH;
        add(getPainelOpcoesExecucao(), c);

        c.gridx = 4;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        c.weightx = 0.1;
        c.weighty = 0.1;
        c.anchor = GridBagConstraints.PAGE_END;
        c.fill = GridBagConstraints.HORIZONTAL;
        add(getBotaoExecutar(), c);
        // add(getListaMetodos());
    }

    private void adicionaListeners() {
        getBotaoCarregarArquivoEntrada().addActionListener(
            controlePainelReconstrucao);
        getBotaoAlterar().addActionListener(controlePainelReconstrucao);
        getListaMetodos().addListSelectionListener(controlePainelReconstrucao);
    }

    public int getID() {
        return id;
    }

    public JList getListaMetodos() {
        if (listaMetodos == null) {
            String[] metodos = {"ml", "distancia", "etc."}; // Temporário! Não deve ficar assim!!!
            listaMetodos = new JList(metodos);
            listaMetodos.setName("listaMetodos");
        }
        return listaMetodos;
    }

    public JPanel getPainelModoReconstrucao() {
        if (painelModoReconstrucao == null) {
            painelModoReconstrucao = new JPanel();
            painelModoReconstrucao.setName("painelModoReconstrucao");
            TitledBorder borda = BorderFactory.createTitledBorder(
                    "Modo de reconstrução");
            painelModoReconstrucao.setBorder(borda);
            painelModoReconstrucao.add(
                    getRadioBotaoModoReconstrucaoAutomatico());
            painelModoReconstrucao.add(getRadioBotaoModoReconstrucaoManual());
            getGrupoBotoesModoReconstrucao();
        }
        return painelModoReconstrucao;
    }

    public ButtonGroup getGrupoBotoesModoReconstrucao() {
        if (grupoBotoesModoReconstrucao == null) {
            grupoBotoesModoReconstrucao = new ButtonGroup();
            grupoBotoesModoReconstrucao.add(
                    getRadioBotaoModoReconstrucaoAutomatico());
            grupoBotoesModoReconstrucao.add(
                    getRadioBotaoModoReconstrucaoManual());
        }
        return grupoBotoesModoReconstrucao;
    }

    public JRadioButton getRadioBotaoModoReconstrucaoAutomatico() {
        if (radioBotaoModoReconstrucaoAutomatico == null) {
            radioBotaoModoReconstrucaoAutomatico = new JRadioButton(
                    "Automatico");
            radioBotaoModoReconstrucaoAutomatico.setName(
                    "radioBotaoModoReconstrucaoAutomatico");
            radioBotaoModoReconstrucaoAutomatico.setActionCommand(
                    "ReconstrucaoAutomatica");
            radioBotaoModoReconstrucaoAutomatico.setSelected(true);
        }
        return radioBotaoModoReconstrucaoAutomatico;
    }

    public JRadioButton getRadioBotaoModoReconstrucaoManual() {
        if (radioBotaoModoReconstrucaoManual == null) {
            radioBotaoModoReconstrucaoManual = new JRadioButton("Manual");
            radioBotaoModoReconstrucaoManual.setName(
                    "radioBotaoModoReconstrucaoManual");
            radioBotaoModoReconstrucaoManual.setActionCommand(
                    "ReconstrucaoManual");
        }
        return radioBotaoModoReconstrucaoManual;
    }

    public PainelRotulado getPainelArquivoEntrada() {
        if (painelArquivoEntrada == null) {
            painelArquivoEntrada = new PainelRotulado("Sequência");
            painelArquivoEntrada.setName("painelArquivoEntrada");
            GridBagConstraints c = new GridBagConstraints();
            painelArquivoEntrada.setLayout(new GridBagLayout());
            c.gridx = 0;
            c.gridy = 0;
            c.ipadx = 5;
            c.ipady = 5;
            c.weightx = 0.9;
            c.weighty = 0.0;
            c.gridwidth = 4;
            c.gridheight = 1;
            c.insets = new Insets(10, 10, 10, 10);
            c.anchor = GridBagConstraints.PAGE_START;
            c.fill = GridBagConstraints.HORIZONTAL;
            painelArquivoEntrada.add(getCampoTextoArquivoEntrada(), c);
            c.gridx = 4;
            c.gridy = 0;
            c.weightx = 0.1;
            c.weighty = 0.0;
            c.gridwidth = 1;
            c.gridheight = 1;
            c.insets = new Insets(0, 0, 0, 0);
            c.anchor = GridBagConstraints.CENTER;
            c.fill = GridBagConstraints.NONE;
            painelArquivoEntrada.add(getBotaoCarregarArquivoEntrada(), c);
        }
        return painelArquivoEntrada;
    }

    public JTextField getCampoTextoArquivoEntrada() {
        if (campoTextoArquivoEntrada == null) {
            campoTextoArquivoEntrada = new JTextField();
            campoTextoArquivoEntrada.setName("campoTextoArquivoEntrada");
            campoTextoArquivoEntrada.setEditable(false);
            // campoTextoArquivoEntrada.setPreferredSize(new Dimension(700, 20));
        }
        return campoTextoArquivoEntrada;
    }

    public JButton getBotaoCarregarArquivoEntrada() {
        if (botaoCarregarArquivoEntrada == null) {
            botaoCarregarArquivoEntrada = new JButton("Carregar");
            botaoCarregarArquivoEntrada.setName("botaoCarregarArquivoEntrada");
            botaoCarregarArquivoEntrada.setActionCommand(
                    "CarregarArquivoSequencia");
        }
        return botaoCarregarArquivoEntrada;
    }

    public JPanel getPainelOpcoesExecucao() {
        if (painelOpcoesExecucao == null) {
            painelOpcoesExecucao = new JPanel();
            painelOpcoesExecucao.setName("painelOpcoesExecucao");
            //painelOpcoesExecucao.setBackground(Color.red);
            GridBagConstraints c = new GridBagConstraints();
            painelOpcoesExecucao.setLayout(new GridBagLayout());
            c.gridx = 0;
            c.gridy = 0;
            //c.ipadx = 5;
            //c.ipady = 5;
            c.weightx = 0.1;
            c.weighty = 0.1;
            c.gridwidth = 1;
            c.gridheight = 1;
            c.insets = new Insets(10, 10, 10, 10);
            c.anchor = GridBagConstraints.FIRST_LINE_START;
            painelOpcoesExecucao.add(getPainelMetodo(), c);
            c.gridx = 1;
            c.gridy = 0;
            painelOpcoesExecucao.add(getPainelPrograma(), c);
            // c.gridx = 2;
            // c.gridy = 0;
            // painelOpcoesExecucao.add(getBotaoAlterar(), c);
            c.gridx = 0;
            c.gridy = 1;
            c.gridwidth = 2;
            c.gridheight = 2;
            c.anchor = GridBagConstraints.LINE_START;
            c.fill = GridBagConstraints.BOTH;
            painelOpcoesExecucao.add(getPainelDigrafu(), c);
        }
        return painelOpcoesExecucao;
    }

    public PainelRotulado getPainelMetodo() {
        if (painelMetodo == null) {
            painelMetodo = new PainelRotulado("Método");
            painelMetodo.setName("painelMetodo");
            painelMetodo.add(getComboMetodo());
            painelMetodo.setMinimumSize(new Dimension(230, 120));
        }
        return painelMetodo;
    }

    public JComboBox getComboMetodo() {
        if (comboMetodo == null) {
            String[] metodos = {"Distância", "Máxima Verossimilhança",
                                "Inferência Bayesiana", "Parcimônia"}; // Temporário! Não deve ficar assim!!!
            comboMetodo = new JComboBox(metodos);
            comboMetodo.setName("comboMetodo");
        }
        return comboMetodo;
    }

    public PainelRotulado getPainelPrograma() {
        if (painelPrograma == null) {
            painelPrograma = new PainelRotulado("Programa");
            painelPrograma.setName("painelPrograma");
            painelPrograma.add(getComboPrograma());
            painelPrograma.setMinimumSize(new Dimension(130, 120));
        }
        return painelPrograma;
    }

    public JComboBox getComboPrograma() {
        if (comboPrograma == null) {
            String[] programas = {"DiGrafu", "PhyML", "Mr. Bayes"}; // Temporário! Não deve ficar assim!!!
            comboPrograma = new JComboBox(programas);
            comboPrograma.setName("comboPrograma");
        }
        return comboPrograma;
    }

    public JButton getBotaoVerArvore() {
        if (botaoVerArvore == null) {
            botaoVerArvore = new JButton("Ver árvore");
            botaoVerArvore.setName("botaoVerArvore");
        }
        return botaoVerArvore;
    }

    public JButton getBotaoExecutar() {
        if (botaoExecutar == null) {
            botaoExecutar = new JButton("Executar");
            botaoExecutar.setName("botaoExecutar");
        }
        return botaoExecutar;
    }

    public PainelRotulado getPainelParametros() {
        if (painelParametros == null) {
            painelParametros = new PainelRotulado("Parametros");
            painelParametros.setName("painelParametros");
            painelParametros.add(getBotaoAlterar());
        }
        return painelParametros;
    }

    public JButton getBotaoAlterar() {
        if (botaoAlterar == null) {
            botaoAlterar = new JButton("Alterar parâmetros");
            botaoAlterar.setName("botaoAlterar");
            botaoAlterar.setActionCommand(
                    "AlterarParametrosPrograma");
        }
        return botaoAlterar;
    }

    public PainelDigrafu getPainelDigrafu() {
        if (painelDigrafu == null) {
            painelDigrafu = new PainelDigrafu(newIGrafu);
            painelDigrafu.setName("painelDigrafu");
        }
        return painelDigrafu;
    }

}
